home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 July / EnigmA AMIGA RUN 20 (1997)(G.R. Edizioni)(IT)[!][issue 1997-07 & 08][EAR-CD IV].iso / earcd / dev / c / asyncio.lha / AsyncIO / asyncio.doc next >
Text File  |  1997-04-27  |  32KB  |  836 lines

  1. TABLE OF CONTENTS
  2.  
  3. asyncio/--background--
  4. asyncio/--history--
  5. asyncio/--changes--
  6. asyncio/CloseAsync
  7. asyncio/FGetsAsync
  8. asyncio/FGetsLenAsync
  9. asyncio/OpenAsync
  10. asyncio/ReadAsync
  11. asyncio/ReadCharAsync
  12. asyncio/ReadLineAsync
  13. asyncio/SeekAsync
  14. asyncio/WriteAsync
  15. asyncio/WriteCharAsync
  16. asyncio/WriteLineAsync
  17. asyncio/--background--                                 asyncio/--background--
  18.  
  19. This documentation and source code was written by Martin Taillefer.
  20.  
  21. Reading and writing data is crucial to most applications and is in many cases
  22. a major bottleneck. Using AmigaDOS' sophisticated file system architecture
  23. can help reduce, and sometimes eliminate, the time spent waiting for IO to
  24. complete. This package offers a few small routines that can greatly improve
  25. an application's IO performance.
  26.  
  27. Normally, an application processes a file in a manner similar to the following:
  28.  
  29.   1 - Open the file
  30.  
  31.   2 - Read some data
  32.  
  33.   3 - Process data just read
  34.  
  35.   4 - Repeat steps 2 and 3 until all data is processed
  36.  
  37.   5 - Close file
  38.  
  39. Although the above sequence works fine, it doesn't make full use of the Amiga's
  40. multitasking abilities. Step 2 in the above can become a serious bottleneck.
  41. Whenever the application needs some data by using the DOS Read() function,
  42. AmigaDOS has to put that task to sleep, and initiate a request to the file
  43. system to have it fetch the data. The file system then starts up the disk
  44. hardware and reads the data. Once the data is read, the application is woken up
  45. and can start processing the data just read.
  46.  
  47. The point to note in the above paragraph is that when the file system is
  48. reading data from disk, the application is asleep. Wouldn't it be nice if the
  49. application could keep running while data is being fetched for it?
  50.  
  51. Most Amiga hard drives make use of DMA (Direct Memory Access). DMA enables a
  52. hard drive to transfer data to memory _at the same time_ as the CPU does some
  53. work. This parallelism is what makes the set of accompanying routines so
  54. efficient. They exploit the fact that data can be transfered to memory while
  55. the application is busy processing other data.
  56.  
  57. Using the asynchronous IO routines, an application's IO happens like this:
  58.  
  59.   1 - Open the file, ask the file system to start reading ahead
  60.  
  61.   2 - Read some data, ask the file system to read more data
  62.  
  63.   3 - Process data
  64.  
  65.   4 - Repeat steps 2 and 3 until all data is processed
  66.  
  67.   5 - Close file
  68.  
  69. Immediately after opening the file, a request is sent to the file system to get
  70. it reading data in the background. By the time the application gets around to
  71. reading the first byte of data, it is likely already in memory. That means the
  72. application doesn't need to wait and can start processing the data. As soon as
  73. the application starts processing data from the file, a second request is sent
  74. out to the file system to fill up a second buffer. Once the application is done
  75. processing the first buffer, it starts processing the second one. When this
  76. happens, the file system starts filling up the first buffer again with new
  77. data. This process continues until all data has been read.
  78.  
  79. The whole technique is known as "double-buffered asynchronous IO" since it uses
  80. two buffers, and happens in the background (asynchronously).
  81.  
  82. The set of functions presented below offers high-performance IO using the
  83. technique described above. The interface is very similar to standard AmigaDOS
  84. files. These routines enable full asynchronous read/write of any file.
  85.  
  86. asyncio/--history--                                       asyncio/--history--
  87.  
  88. 23-Mar-94
  89. ---------
  90.  
  91.   - When seeking within the current read buffer, the wrong packet would be
  92.     sent out to be filled asynchronously. Depending on the data read from
  93.     the buffer, and how fast it was read, you could end up getting incorrect
  94.     data on subsequent ReadAsync() calls.
  95.  
  96.   - There was actually bufferSize*2 bytes allocated for IO buffers instead
  97.     of just bufferSize. This is fixed. So if you want the same effective
  98.     buffer size as before, you must double the value of the bufferSize
  99.     argument supplied to OpenAsync().
  100.  
  101.   - MEMF_PUBLIC is now specified for the IO buffers. This is in support
  102.     of VM hacks such as GigaMem.
  103.  
  104.   - A Seek() call had the mode and offset parameters reversed. The code worked,
  105.     because both values were luckily always 0, but it was not very clean.
  106.  
  107.   - Now uses a typedef for the AsyncFile structure, and enums for the
  108.     open modes and seek modes.
  109.  
  110. 16-Feb-94
  111. ---------
  112.  
  113.   - SeekAsync() now consistently works. It was getting confused when called
  114.     multiple times in a row with no intervening IO.
  115.  
  116.   - WriteAsync() would produce garbage in the destination file if it had
  117.     to bring up a "Disk is full" requester, and the user freed some room on
  118.     the disk and selected "Retry".
  119.  
  120. asyncio/--changes--                                       asyncio/--changes--
  121.  
  122. All changes described in this section were made by Magnus Holmgren. If you
  123. want to contact me about something, feel free to send a message to
  124. cmh@lls.se or "Magnus Holmgren", 2:203/512.10@fidonet.org.
  125.  
  126. I've been in contact with Martin Taillefer, and he is aware of me releasing
  127. new versions of (t)his code. However, he is not informed about the actual
  128. details of the changes. Thus, any comments about the code (and especially
  129. the changes) should not be sent to him. Most of my changes are noted in the
  130. sources with a comment that starts with "MH:".
  131.  
  132. The code was compiled using SAS/C. Earlier version were compiled with DICE
  133. 3.0. GCC and StormC should be able to compile it as well, without any
  134. (large) changes (although I haven't tested this).
  135.  
  136. The DICE link libraries are created with the help of the LbMake utility in
  137. the DICE package. The file Lib.Def contains the definitions for them.
  138.  
  139. Notes about the different link libraries:
  140.  
  141.   · The 'DLib' drawer contains DICE versions of the link libraries, and
  142.     'Lib' contains the SAS/C versions ('Libs' contains the shared library).
  143.  
  144.   · The asyncio.lib libraries should be used when creating standalone
  145.     versions of the program. The ASIO_NO_EXTERNALS versions will have an
  146.     extra 'e' "flag" in the name.
  147.  
  148.   · New link libraries with the base name asynciolib.lib are needed if
  149.     you want to use asyncio.library, and don't use the DICE -mi option (or
  150.     perhaps you want to have the autoinit code). Note that there is no
  151.     corresponding SAS/C asynciolib.lib. Link with any of the asyncio*.lib
  152.     link libraries to get the autoinit code, if needed (there is no glue
  153.     available, as I don't want to write it by hand ;).
  154.  
  155.   · The include file "include/diceclib/asyncio_protos.h" is for DICE 3.0.
  156.     This include file should go to "dinclude:clib" (you only need this to
  157.     use the -mi option to use inline Amiga function calls), whereas the
  158.     other ones should be copied to the respective drawers in
  159.     "dinclude:amiga??/" (DICE) or "include:" (SAS/C).
  160.  
  161. Notes about how to use the different link libraries:
  162.  
  163.   · To use the shared library:
  164.  
  165.     DICE  - Define ASIO_SHARED_LIB and link with asynciolib#?.lib if you
  166.             didn't use the -mi option, or you need the autoinit code.
  167.             Remember that you must copy include/diceclib/asyncio_protos,h
  168.             to dinclude:clib/ if you use the -mi option.
  169.  
  170.     SAS/C - Include <proto/asyncio.h>, and link with asyncio.lib if you
  171.             need the autoinit code. Currently there is no glue code
  172.             available, so you must include the proto-file. This proto file
  173.             defines ASIO_SHARED_LIB for you.
  174.  
  175.   · To use the link library for standalone programs:
  176.  
  177.     Simply link with the appropriate link library, and make sure you only
  178.     define ASIO_REGARGS when you want the regargs version.
  179.  
  180.     Warning for SAS/C users: If you link with the wrong library, the
  181.     program will link properly, but will show strange errors when run!
  182.  
  183.     The reason for this "problem" is that I wanted to be able to use the
  184.     regargs version from assembler, without assuming which register
  185.     contained which argument, and then SAS/C does it this way (i.e. no
  186.     difference in function names, as would normally happen for register
  187.     argument functions).
  188.  
  189.   · To use the "no externals" version of the link library:
  190.  
  191.     You need to compile the library for starters. ;) Then define
  192.     ASIO_NO_EXTERNALS.
  193.  
  194.     DICE  - To compile the library simply type e.g. "lbmake asyncio s r e"
  195.             and have dtmp: set to some temporary space. This creates a
  196.             regargs, smalldata version.
  197.  
  198.     SAS/C - Type e.g. "dmake lib/asyncioer.lib" to get the regargs version.
  199.  
  200. Notes:
  201.  
  202.   · When defining any ASIO_#? symbol above, it must be done before any
  203.     asyncio include file is read.
  204.  
  205.   · I haven't personally tested all combinations above. The shared library
  206.     have had some quick tests, while the "no external" versions of the link
  207.     libraries haven't even been compiled. ;)
  208.  
  209.   · SAS/C users still need dmake (from DICE) to compile things. This since
  210.     SMake lacks one feature in DMake I find very useful.
  211.  
  212.  
  213.   Release 9 - 27-Apr-97
  214.   ---------------------
  215.  
  216.   · Oops. The include/clib/asyncio_protos.h file wasn't quite correct,
  217.     causing problems when compiling with SAS/C and ASIO_REGARGS defined.
  218.     Also updated includes for StormC. Thanks to Alexander Kazik who sent me
  219.     the needed changes for StormC.
  220.  
  221.   · Michael B. Smith pointed out that ReadLineAsync() wasn't quite FGets()-
  222.     compatible. So he sent me his version, which was. I've now added his
  223.     version (with some minor changes by me), and changed the implementation
  224.     for ReadLineAsync() to first call the new function FGetsLenAsync(), and
  225.     then skip up to the LF char, for backward compatibility.
  226.  
  227.   · Added PeekAsync(), to allow you to look ahead in the current buffer
  228.     without actually "reading" anything. Useful when reading from pipes to
  229.     e.g. find out the file type (needed in Visage ;).
  230.  
  231.   · Bumped the library version to 39, because of the new functions.
  232.  
  233.   · The autoopen code for SAS/C now uses __asiolibversion rather than
  234.     __oslibversion (in case of failure, __oslibversion is set to the value
  235.     of __asiolibversion, and the standard __autoopenfail is called, in
  236.     order to save code). The default value is 39, and any external
  237.     reference to __asiolibversion will cause the autoopen code to be linked.
  238.  
  239.   · Ouch. The DMakeFile/lib.def files contained some laws. As a result, the
  240.     DICE linker libraries (in dlib/) were not updated at all. Now there
  241.     should be fresh libraries for both DICE and SAS/C.
  242.  
  243.   · Fixed a couple of typos in the autodocs, including the problem with the
  244.     enum arguments specified as (U)BYTE, when they need to be LONG (some
  245.     compilers assumes enums to be longs, unless told otherwise).
  246.  
  247.   Release 8 - 28-Jan-97
  248.   ---------------------
  249.  
  250.   · Yet another hole in SeekAsync() (hopefully) plugged. ;) Seeking in a
  251.     double-buffered file is tricky business it seems. Thanks to David
  252.     Eaves for finding it, and sending me a good report about it (including
  253.     source to reproduce it).
  254.  
  255.     The problem was that when SeekAsync() really seeked past the end of the
  256.     file, it didn't notice, and would try to reload the "last" buffer.
  257.  
  258.   · Finally finished up the ReadLineAsync() function. Only difference from
  259.     dos.library/FGets() should be the return value. I hope it works
  260.     properly, since I haven't tested it that much. ;)
  261.  
  262.   · Bumped the library version to 38, because of the new functions.
  263.  
  264.   Release 7 - 7-Jan-96
  265.   --------------------
  266.  
  267.   · Files to use asyncio.library from E included.
  268.  
  269.   · Fixed yet some SeekAsync() problems. It could (still) get confused when
  270.     called multiple times in a row with no intervening IO. I wonder if
  271.     there are any holes left. ;)
  272.  
  273.   · Some more fixes to the shared library.
  274.  
  275.   · asyncio.library bumped to version 37.2.
  276.  
  277.   · Recompiled asyncio.library using SAS/C 6.56, and added general SAS/C
  278.     support.
  279.  
  280.   · Cleaned up parts of this doc.
  281.  
  282.   Release 6 - 10-Nov-95
  283.   ---------------------
  284.  
  285.   · Bumped to version 6, since there was an "official" release 3 that I was
  286.     unaware of. However, most of the changes were in the AIFF source (see
  287.     below). Thus, not much was "lost" due to this. (In fact, the SeekAsync
  288.     bugfix in the real release 3 was not correct. ;)
  289.  
  290.   · Sigh. The SeekAsync fix (to the performance problem) was buggy. :/ I
  291.     think I've got it right now.
  292.  
  293.   · asyncio.library bumed to version 37.1.
  294.  
  295.   · Cleaned up this documentation.
  296.  
  297.   · Fixed some bugs in the include files.
  298.  
  299.   · Made some fixes to the shared library.
  300.  
  301.   Release 4 - 13-Sep-95
  302.   ---------------------
  303.  
  304.   · Oops. Forgot to include the include/asyncio.h file. Maybe as well,
  305.     since I anyway had forgot to mention a few things in it.. ;)
  306.  
  307.   · Asyncio is now also available as a shared library (to be placed in
  308.     libs:). This means that a couple of new include files were added, and a
  309.     one include file was split up.
  310.  
  311.     The main reason for doing this was to simplify the use of it in other
  312.     languages (only need to "port" a few includes). I have no other include
  313.     files than those for (DICE) C at the moment, but feel free to send me
  314.     headers for other languages as well.
  315.  
  316.     Note: I have not yet verified that the SeekAsync function works, but
  317.     since read and write works just fine, I see no reason why SeekAsync
  318.     wouldn't work. ;)
  319.  
  320.     Also, I haven't really used it in programs much either (only some
  321.     testing), so the different defines and similar to use different
  322.     versions may be a bit clumsy to use (see above for more information).
  323.     Feel free to send me comments on how to improve this.
  324.  
  325.   · Changed so that a non-regargs version of the link library can be
  326.     created. To use the regargs version now, simply make sure that
  327.     ASIO_REGARGS is defined, and link with the proper link library.
  328.  
  329.   · Changed the name of the NOEXTERNALS define to ASIO_NOEXTERNALS. Define
  330.     this before you include <clib/asyncio_protos.h> if you want to use that
  331.     feature. Note that you need to create a proper link library yourself!
  332.     (With DICE, all you need to do is "LbMake asyncio s r e" in the Src
  333.     drawer.)
  334.  
  335.   · Modified OpenAsync() a little, to work around a problem when having
  336.     SnoopDos (with SendARexx active), MungWall and Enforcer running. Not an
  337.     asyncio bug as such, but.. ;)
  338.  
  339.   Release 3 - 12-Aug-95
  340.   ---------------------
  341.  
  342.   This version includes a couple of enhancements (most from asyncio code
  343.   found in the sources to the AIFF datatype, by Olaf `Olsen' Barthel) and a
  344.   couple of bugfixes to SeekAsync():
  345.  
  346.   · SeekAsync() is now not unecessarely slow when doing some "kinds" of
  347.     read-mode seeks (typically when seeking after some small amount of
  348.     initial read). The problem was that it usually only considered the
  349.     newly arrived buffer, not both buffers. This could make it discard both
  350.     buffers, and restart reading, although one of the buffers already had
  351.     the needed data. Note that the kind of seeks that caused the above
  352.     problem may still seem to be somewhat slow, since the code must wait
  353.     for both buffers to be loaded. This cannot (easily) be avoided.
  354.  
  355.   · SeekAsync() doesn't cause the read buffer to contain garbage after
  356.     certain seeks any more. The problem was that ReadAsync() would read
  357.     from the wrong buffer (the one currently being loaded). This made the
  358.     files seem to contain garbage. This happened when the seek location
  359.     was within the newly arrived buffer.
  360.  
  361.   · The code package is now supplied as a link library, rather than a
  362.     single source module. The internal functions labeled "AS_#?" are
  363.     private and should not be called directly by the application.
  364.  
  365.   · A few minor "cosmetic" changes were done, to either make the code more
  366.     readable, or to make it slightly smaller.
  367.  
  368.   · Include file restructured a little (a public and a private part).
  369.  
  370.   · OpenAsync() now offers some new "options" (all from the AIFF code by
  371.     Olaf Barthel):
  372.     - Opening a file from an already open filehandle is now possible.
  373.     - A "no externals" version may be compiled, that doesn't require any
  374.        external variables to be available.
  375.     - Each of the buffers will now be roughly bufferSize / 2 bytes large,
  376.        rather than bufferSize bytes (rel 6 note: Really from Taillefers
  377.        third release).
  378.     - If there isn't enough memory for the requested buffer size, the code
  379.        will try with smaller buffers (still properly "aligned") before
  380.        giving up.
  381.  
  382. asyncio/CloseAsync                                         asyncio/CloseAsync
  383.  
  384.    NAME
  385.     CloseAsync -- close an async file.
  386.  
  387.    SYNOPSIS
  388.     success = CloseAsync( file );
  389.       d0                   a0
  390.  
  391.     LONG CloseAsync( struct AsyncFile * );
  392.  
  393.    FUNCTION
  394.     Closes a file, flushing any pending writes. Once this call has been
  395.     made, the file can no longer be accessed.
  396.  
  397.    INPUTS
  398.     file - the file to close. May be NULL, in which case this function
  399.            returns -1 and sets the IoErr() code to ERROR_INVALID_LOCk.
  400.  
  401.    RESULT
  402.     result - < 0 for an error, >= 0 for success. Indicates whether closing
  403.         the file worked or not. If the file was opened in read-mode,
  404.         then this call will always work. In case of error,
  405.         dos.library/IoErr() can give more information.
  406.  
  407.    SEE ALSO
  408.     OpenAsync(), dos.library/Close()
  409.  
  410. asyncio/FGetsAsync                                         asyncio/FGetsAsync
  411.  
  412.    NAME
  413.     FGetsAsync -- read a line from an async file, fgets-style.
  414.  
  415.    SYNOPSIS
  416.     buffer = FGetsAsync( file, buffer, size );
  417.       d0                  a0     a1     d0
  418.  
  419.     APTR ReadLineAsync( struct AsyncFile *, APTR, LONG );
  420.  
  421.    FUNCTION
  422.     This function reads a single line from an async file, stopping at
  423.     either a NEWLINE character or EOF. In either event, UP TO the
  424.     number of size specified bytes minus 1 will be copied into the
  425.     buffer. It returns the number of bytes put into the buffer,
  426.     excluding the null-termination. 0 indicates EOF, and -1 indicates
  427.     read error.
  428.  
  429.         If terminated by a newline, the newline WILL be the last character in
  430.         the buffer. The string read in IS null-terminated.
  431.  
  432.    INPUTS
  433.     file - opened file to read from, as obtained from OpenAsync()
  434.     buffer - buffer to read the line into.
  435.     size - size of the buffer, in bytes.
  436.  
  437.    RESULT
  438.     buffer - Pointer to buffer passed in, or NULL for immediate EOF or
  439.         for an error. If NULL is returned for EOF, then
  440.         dos.library/IoErr() returns 0.
  441.  
  442.    NOTES
  443.     If the entire line does not fit in the buffer, then the last char
  444.     of the buffer will currently not be used. Don't rely on, nor expect
  445.     this behaviour. It is only mentioned so that you won't send a bug
  446.     report about it. ;)
  447.  
  448.    SEE ALSO
  449.     OpenAsync(), CloseAsync(), ReadCharAsync(), WriteLineAsync(),
  450.     FGetsLenAsync(), ReadLineAsync(), dos.library/FGets()
  451.  
  452. asyncio/FGetsLenAsync                                   asyncio/FGetsLenAsync
  453.  
  454.    NAME
  455.     FGetsLenAsync -- read a line from an async file.
  456.  
  457.    SYNOPSIS
  458.     buffer = FGetsLenAsync( file, buffer, size, length );
  459.       d0                     a0     a1     d0     a2
  460.  
  461.     APTR FGetsLenAsync( struct AsyncFile *, APTR, LONG, LONG * );
  462.  
  463.    FUNCTION
  464.     This function reads a single line from an async file, stopping at
  465.     either a NEWLINE character or EOF. In either event, UP TO the
  466.     number of size specified bytes minus 1 will be copied into the
  467.     buffer. It returns the number of bytes put into the buffer,
  468.     excluding the null-termination. 0 indicates EOF, and -1 indicates
  469.     read error.
  470.  
  471.     If terminated by a newline, the newline WILL be the last character in
  472.     the buffer. The string read in IS null-terminated.
  473.  
  474.    INPUTS
  475.     file - opened file to read from, as obtained from OpenAsync()
  476.     buffer - buffer to read the line into.
  477.     size - size of the buffer, in bytes.
  478.     length - pointer to ULONG to hold the length of the line, excluding
  479.         the terminating null.
  480.  
  481.    RESULT
  482.     buffer - Pointer to buffer passed in, or NULL for immediate EOF or
  483.         for an error. If NULL is returned for EOF, then
  484.         dos.library/IoErr() returns 0.
  485.  
  486.    SEE ALSO
  487.     OpenAsync(), CloseAsync(), ReadCharAsync(), WriteLineAsync(),
  488.     FGetsAsync(), ReadLineAsync(), dos.library/FGets()
  489.  
  490. asyncio/OpenAsync                                           asyncio/OpenAsync
  491.  
  492.    NAME
  493.     OpenAsync -- open a file for asynchronous IO.
  494.  
  495.    SYNOPSIS
  496.     file = OpenAsync( fileName, accessMode, bufferSize
  497.      d0                  a0         d0          d1
  498.                                            [, sysbase, dosbase ] );
  499.                                                 a1       a2
  500.  
  501.     struct AsyncFile *OpenAsync( const STRPTR, LONG, LONG
  502.                        [, struct ExecBase *, struct DosLibrary * ] );
  503.  
  504.     file = OpenAsyncFromFH( handle, accessMode, bufferSize
  505.                               a0        d0          d1
  506.                                            [, sysbase, dosbase ] );
  507.                                                 a1       a2
  508.  
  509.     struct AsyncFile *OpenAsyncFromFH( BPTR, LONG, LONG
  510.                        [, struct ExecBase *, struct DosLibrary * ] );
  511.  
  512.    FUNCTION
  513.     The named file is opened and an async file handle returned. If the
  514.     accessMode is MODE_READ, an existing file is opened for reading.
  515.     If accessMode is MODE_WRITE, a new file is created for writing. If
  516.     a file of the same name already exists, it is first deleted. If
  517.     accessMode is MODE_APPEND, an existing file is prepared for writing.
  518.     Data written is added to the end of the file. If the file does not
  519.     exists, it is created.
  520.  
  521.     'fileName' is a filename and CANNOT be a window specification such as
  522.     CON: or RAW:, or "*"
  523.  
  524.     'bufferSize' specifies the size of the IO buffer to use. There are
  525.     in fact two buffers allocated, each of roughly (bufferSize/2) bytes
  526.     in size. The actual buffer size use can vary slightly as the size
  527.     is rounded to speed up DMA.
  528.  
  529.     If the file cannot be opened for any reason, the value returned
  530.     will be NULL, and a secondary error code will be available by
  531.     calling the routine dos.library/IoErr().
  532.  
  533.     INPUTS
  534.     name - name of the file to open, cannot be a window specification
  535.     accessMode - one of MODE_READ, MODE_WRITE, or MODE_APPEND
  536.     bufferSize - size of IO buffer to use. 8192 is recommended as it
  537.         provides very good performance for relatively little memory.
  538.     sysbase - Library base needed for the "no externals" version of the
  539.         library.
  540.     dosbase - Library base, as sysbase.
  541.  
  542.     RESULTS
  543.     file - an async file handle or NULL for failure. You should not access
  544.         the fields in the AsyncFile structure, these are private to the
  545.         async IO routines. In case of failure, dos.library/IoErr() can
  546.         give more information.
  547.  
  548.     NOTES (by MH)
  549.     Although stated that CON:, RAW:, or "*" cannot be used as the file
  550.     name, tests indicates that the 2.0+ "Console:" volume is safe to
  551.     use for writing (haven't tested reading). No guarantees though.
  552.  
  553.     SEE ALSO
  554.     CloseAsync(), dos.library/Open()
  555.  
  556. asyncio/PeekAsync                                           asyncio/PeekAsync
  557.  
  558.    NAME
  559.     PeekAsync -- read bytes from an async file without advancing file
  560.         pointer.
  561.  
  562.    SYNOPSIS
  563.     actualLength = PeekAsync( file, buffer, numBytes );
  564.          d0                    a0     a1       d0
  565.  
  566.    FUNCTION
  567.     This function tries to read bytes of information from an opened
  568.     async file into the buffer given. 'numBytes' is the number of bytes
  569.     to read from the file.
  570.  
  571.     The read is done without advancing the file pointer, and the read
  572.     is limited to what is available in the current buffer (or the next
  573.     buffer, if the current buffer is empty). If the current buffer does
  574.     not contain 'numBytes' bytes, only the bytes left in the buffer is
  575.     read.
  576.  
  577.     Using PeekAsync() can remove the need to SeekAsync() back after some
  578.     ReadAsync() calls (making your read operations more pipe friendly).
  579.  
  580.     The value returned is the length of the information actually read.
  581.     So, when 'actualLength' is greater than zero, the value of
  582.     'actualLength' is the the number of characters read. A value of
  583.     zero means that end-of-file has been reached. Errors are indicated
  584.     by a value of -1.
  585.  
  586.     INPUTS
  587.     file - opened file to read, as obtained from OpenAsync()
  588.     buffer - buffer where to put bytes read
  589.     numBytes - number of bytes to read into buffer
  590.  
  591.     RESULT
  592.     actualLength - actual number of bytes read, or -1 if an error. In
  593.         case of error, dos.library/IoErr() can give more information.
  594.  
  595.     SEE ALSO
  596.     OpenAsync(), CloseAsync(), ReadCharAsync(), WriteAsync(),
  597.     dos.library/Read()
  598.  
  599.  
  600. asyncio/ReadAsync                                           asyncio/ReadAsync
  601.  
  602.    NAME
  603.     ReadAsync -- read bytes from an async file.
  604.  
  605.    SYNOPSIS
  606.     actualLength = ReadAsync( file, buffer, numBytes );
  607.          d0                    a0     a1       d0
  608.  
  609.     LONG ReadAsync( struct AsyncFile *, APTR, LONG );
  610.  
  611.    FUNCTION
  612.     This function reads bytes of information from an opened async file
  613.     into the buffer given. 'numBytes' is the number of bytes to read from
  614.     the file.
  615.  
  616.     The value returned is the length of the information actually read.
  617.     So, when 'actualLength' is greater than zero, the value of
  618.     'actualLength' is the the number of characters read. Usually
  619.     ReadAsync() will try to fill up your buffer before returning. A value
  620.     of zero means that end-of-file has been reached. Errors are indicated
  621.     by a value of -1.
  622.  
  623.     INPUTS
  624.     file - opened file to read, as obtained from OpenAsync()
  625.     buffer - buffer where to put bytes read
  626.     numBytes - number of bytes to read into buffer
  627.  
  628.     RESULT
  629.     actualLength - actual number of bytes read, or -1 if an error. In
  630.         case of error, dos.library/IoErr() can give more information.
  631.  
  632.     SEE ALSO
  633.     OpenAsync(), CloseAsync(), ReadCharAsync(), WriteAsync(),
  634.     dos.library/Read()
  635.  
  636. asyncio/ReadCharAsync                                   asyncio/ReadCharAsync
  637.  
  638.    NAME
  639.     ReadCharAsync -- read a single byte from an async file.
  640.  
  641.    SYNOPSIS
  642.     byte = ReadCharAsync( file );
  643.      d0                    a0
  644.  
  645.     LONG ReadCharAsync( struct AsyncFile * );
  646.  
  647.    FUNCTION
  648.     This function reads a single byte from an async file. The byte is
  649.     returned, or -1 if there was an error reading, or if the end-of-file
  650.     was reached.
  651.  
  652.    INPUTS
  653.     file - opened file to read from, as obtained from OpenAsync()
  654.  
  655.    RESULT
  656.     byte - the byte read, or -1 if no byte was read. In case of error,
  657.         dos.library/IoErr() can give more information. If IoErr()
  658.         returns 0, it means end-of-file was reached. Any other value
  659.         indicates an error.
  660.  
  661.    SEE ALSO
  662.     OpenAsync(), CloseAsync(), ReadAsync(), WriteCharAsync()
  663.     dos.library/Read()
  664.  
  665. asyncio/ReadLineAsync                                   asyncio/ReadLineAsync
  666.  
  667.    NAME
  668.     ReadLineAsync -- read a line from an async file.
  669.  
  670.    SYNOPSIS
  671.     bytes = ReadLineAsync( file, buffer, size );
  672.      d0                     a0     a1     d0
  673.  
  674.     LONG ReadLineAsync( struct AsyncFile *, APTR, ULONG );
  675.  
  676.    FUNCTION
  677.     This function reads a single line from an async file, stopping at
  678.     either a NEWLINE character or EOF. In either event, UP TO the
  679.     number of size specified bytes minus 1 will be copied into the
  680.     buffer. It returns the number of bytes put into the buffer,
  681.     excluding the null-termination. 0 indicates EOF, and -1 indicates
  682.     read error.
  683.  
  684.     If the line in the file is longer than the buffer, the line will be
  685.     truncated (any newline will be present). Any data left in the file
  686.     upto the newline will be lost.
  687.  
  688.     If terminated by a newline, the newline WILL be the last character in
  689.     the buffer. The string read in IS null-terminated.
  690.  
  691.    INPUTS
  692.     file - opened file to read from, as obtained from OpenAsync()
  693.     buffer - buffer to read the line into.
  694.     size - size of the buffer, in bytes.
  695.  
  696.    RESULT
  697.     bytes - number of bytes read. In case of error (-1 is returned)
  698.         dos.library/IoErr() can give more information. EOF is indicated
  699.         by a return of 0.
  700.  
  701.    SEE ALSO
  702.     OpenAsync(), CloseAsync(), ReadCharAsync(), FGetsAsync(),
  703.     WriteLineAsync(), dos.library/FGets()
  704.  
  705. asyncio/SeekAsync                                           asyncio/SeekAsync
  706.  
  707.    NAME
  708.     SeekAsync -- set the current position for reading or writing within
  709.         an async file.
  710.  
  711.    SYNOPSIS
  712.     oldPosition = SeekAsync( file, position, mode );
  713.          d0                   a0      d0      d1
  714.  
  715.     LONG SeekAsync( struct AsyncFile *, LONG, LONG );
  716.  
  717.    FUNCTION
  718.     SeekAsync() sets the read/write cursor for the file 'file' to the
  719.     position 'position'. This position is used by the various read/write
  720.     functions as the place to start reading or writing. The result is the
  721.     current absolute position in the file, or -1 if an error occurs, in
  722.     which case dos.library/IoErr() can be used to find more information.
  723.     'mode' can be MODE_START, MODE_CURRENT or MODE_END. It is used to
  724.     specify the relative start position. For example, 20 from current
  725.     is a position 20 bytes forward from current, -20 is 20 bytes back
  726.     from current.
  727.  
  728.     To find out what the current position within a file is, simply seek
  729.     zero from current.
  730.  
  731.     INPUTS
  732.     file - an opened async file, as obtained from OpenAsync()
  733.     position - the place where to move the read/write cursor
  734.     mode - the mode for the position, one of MODE_START, MODE_CURRENT,
  735.         or MODE_END.
  736.  
  737.     RESULT
  738.     oldPosition - the previous position of the read/write cursor, or -1
  739.         if an error occurs. In case of error, dos.library/IoErr() can
  740.         give more information.
  741.  
  742.     NOTES (by MH)
  743.     If you seek after having read only a few bytes, the function must
  744.     wait for both buffers to be loaded, before the seek can be done.
  745.     This can cause small delays. Note that the above case isn't the
  746.     only one, but the typical one.
  747.  
  748.     SEE ALSO
  749.     OpenAsync(), CloseAsync(), ReadAsync(), WriteAsync(),
  750.     dos.library/Seek()
  751.  
  752. asyncio/WriteAsync                                         asyncio/WriteAsync
  753.  
  754.    NAME
  755.     WriteAsync -- write data to an async file.
  756.  
  757.    SYNOPSIS
  758.     actualLength = WriteAsync( file, buffer, numBytes );
  759.          d0                     a0     a1       d0
  760.  
  761.     LONG WriteAsync( struct AsyncFile *, APTR, LONG );
  762.  
  763.    FUNCTION
  764.     WriteAsync() writes bytes of data to an opened async file. 'numBytes'
  765.     indicates the number of bytes of data to be transferred. 'buffer'
  766.     points to the data to write. The value returned is the length of
  767.     information actually written. So, when 'actualLength' is greater
  768.     than zero, the value of 'actualLength' is the number of characters
  769.     written. Errors are indicated by a return value of -1.
  770.  
  771.     INPUTS
  772.     file - an opened file, as obtained from OpenAsync()
  773.     buffer - address of data to write
  774.     numBytes - number of bytes to write to the file
  775.  
  776.     RESULT
  777.     actualLength - number of bytes written, or -1 if error. In case
  778.         of error, dos.library/IoErr() can give more information.
  779.  
  780.     SEE ALSO
  781.     OpenAsync(), CloseAsync(), ReadAsync(), WriteCharAsync(),
  782.     dos.library/Write()
  783.  
  784. asyncio/WriteCharAsync                                 asyncio/WriteCharAsync
  785.  
  786.    NAME
  787.     WriteCharAsync -- write a single byte to an async file.
  788.  
  789.    SYNOPSIS
  790.     result = WriteCharAsync( file, byte );
  791.       d0                      a0    d0
  792.  
  793.     LONG WriteCharAsync( struct AsyncFile *, UBYTE );
  794.  
  795.    FUNCTION
  796.     This function writes a single byte to an async file.
  797.  
  798.    INPUTS
  799.     file - an opened async file, as obtained from OpenAsync()
  800.     byte - byte of data to add to the file
  801.  
  802.    RESULT
  803.     result - 1 if the byte was written, -1 if there was an error. In
  804.         case of error, dos.library/IoErr() can give more information.
  805.  
  806.    SEE ALSO
  807.     OpenAsync(), CloseAsync(), ReadAsync(), WriteAsync(),
  808.     dos.library/Write()
  809.  
  810. asyncio/WriteLineAsync                                 asyncio/WriteLineAsync
  811.  
  812.    NAME
  813.     WriteLineAsync -- write a line to an async file.
  814.  
  815.    SYNOPSIS
  816.     bytes = WriteLineAsync(file, buffer);
  817.  
  818.     LONG WriteLineAsync(struct AsyncFile *, STRPTR);
  819.  
  820.    FUNCTION
  821.     This function writes an unformatted string to an async file. No
  822.     newline is appended to the string.
  823.  
  824.    INPUTS
  825.     file - opened file to read from, as obtained from OpenAsync()
  826.     buffer - buffer to write to the file
  827.  
  828.    RESULT
  829.     bytes - number of bytes written, or -1 if there was an error. In
  830.         case of error, dos.library/IoErr() can give more information.
  831.  
  832.    SEE ALSO
  833.     OpenAsync(), CloseAsync(), ReadCharAsync(), WriteCharAsync(),
  834.     FGetsAsync(), FGetsLenAsync(), ReadLineAsync(), dos.library/FPuts()
  835.  
  836.